/* 
下面的两个操作符定义了属性的搜索方式，对对象的一个整体控制
[[Get]]:这个操作符都有先在对象本身寻找，然后再到原型链上寻找
[[Put]]:用来设置或者是创建一个属性

在js中式不允许修改[[Get]][[Put]]的策略，但是提供了一种修改每个变量的方式
*/
(function () {
    var myObj={
        get a(){
            return 2;
        }
    }
    Object.defineProperty(myObj,"b",{
        get:function(){
            return 4;
        }
    })

    console.log(myObj.a);
    console.log(myObj.b);
    
    // 由于只有get方法，所以没有办法进行set
    myObj.a=5;
    console.log(myObj.a);
})();

(function () {
    console.log("=============add get and set method=============");
    var myObj={
        get a(){
            return this._a_;//这里的this指向的就是myObj
        },
        set a(val){
            this._a_=val;
        }
    }

    console.log(myObj.a);
    myObj.a=5;
    console.log(myObj.a);
})();

// 测试一个属性在不在一个对象上
(function () {
    console.log("=====check obj has a or nor=============");
    var myObj={
        a:3
    };
    //这个只会去找自身有没有这个a字段，不会去原型链上寻找，如果需要在原型链上也找的话可以使用in
    console.log(myObj.hasOwnProperty("a"));
})();